package com.tong.hao.ac.service.transfer.query;

import cn.buddha.jec.model.mapstruct.TongBasicTransfer;
import com.tong.hao.ac.api.model.in.query.QueryUserInfoIn;
import com.tong.hao.ac.db.entity.Users;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

/**
 * @Author 友野浩二
 * @Description // QueryUserInfoIn与Users之间的相互转换(属性赋值)
 *
 * <pre>
 * @ Mapper :
 *     定义这是一个MapStruct对象属性转换接口，在这个类里面规定转换规则。
 *     在项目构建时，会自动生成该接口的实现类，这个实现类将实现对象属性值复制。
 *
 * (componentModel = "spring"):
 *      表示把当前Mapper类纳入spring容器。
 *      由mapstruct自动生成的实现类文件，会发现标记了@Component注解。
 * </pre>
 */
@Mapper(componentModel = "spring")
public interface QueryUserInfoTransfer extends TongBasicTransfer<QueryUserInfoIn, Users> {

    /**
     * @Author 友野浩二
     * @Description // QueryUserInfoIn属性复制给Users
     * @Param [var1]
     * @return com.tong.hao.common.entity.ac.Users
     *
     * <pre>
     *     如果SOURCE和TARGET两个对象的属性名相同的且数据类型也是相同的,则是可以省略@Mapping。
     *     1- entity与dto中属性名相同的默认映射(如这两个类都有fullName属性)
     *     2- entity与dto中属性名不同的，需要通过@Mapping明确关系来形成映射(如QueryUserInfoIn.mailbox对应Users.email)
     *     3- 形成映射关系的属性类型不同的,需要通过表达式转换数据类型类型(如Date对应String)
     *     4- 无映射关系属性被忽略(如Users.id和age在QueryUserInfoIn里面就没有，所以就不用管)
     * </pre>
     */
    @Override
    @Mappings({
            @Mapping(source = "mailbox", target = "email")
    })
    Users to(QueryUserInfoIn var1);

    /**
     * <pre>
     *     @InheritInverseConfiguration的作用：
     *     前提：QueryUserInfoIn.mailbox和Users.email属性名不一致，在to方法上使用@Mapping注解进行了转换。可以看到to方法中就会有相应的复制。
     *           users.setEmail(var1.getMailbox());
     *     如果此时from方法上没有@InheritInverseConfiguration注解，那么实现类中就不会有
     *           queryUserInfoIn.setMailbox(var1.getEmail());
     *           如果不嫌弃麻烦，也可以不用该注解，在当前类中也将from方法进行重写(使用@Mapping来处理属性之间的复制)
     * </pre>
     */
}
